home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 January: Mac OS SDK / Dev.CD Jan 97 SDK2.toast / Development Kits (Disc 2) / OpenDoc Development Framework / ODFDev / Draw / Sources / DrawCmds.cpp < prev    next >
Encoding:
Text File  |  1996-09-17  |  25.4 KB  |  788 lines  |  [TEXT/MPS ]

  1. //========================================================================================
  2. //
  3. //    File:                DrawCmds.cpp
  4. //    Release Version:    $ ODF 2 $
  5. //
  6. //    Author:                Mary Boetcher
  7. //
  8. //    Copyright:            (c) 1993 - 1996 by Apple Computer, Inc., all rights reserved.
  9. //
  10. //========================================================================================
  11.  
  12. #include "ODFDraw.hpp"
  13.  
  14. #ifndef DRAWCMDS_H
  15. #include "DrawCmds.h"
  16. #endif
  17.  
  18. #ifndef DRAWCONT_H
  19. #include "DrawCont.h"
  20. #endif
  21.  
  22. #ifndef DRAWPART_H
  23. #include "DrawPart.h"
  24. #endif
  25.  
  26. #ifndef DRAWSEL_H
  27. #include "DrawSel.h"
  28. #endif
  29.  
  30. #ifndef DRAWCLIP_H
  31. #include "DrawClip.h"
  32. #endif
  33.  
  34. #ifndef BASESHP_H
  35. #include "BaseShp.h"
  36. #endif
  37.  
  38. #ifndef DRAWFRM_H
  39. #include "DrawFrm.h"
  40. #endif
  41.  
  42. #ifndef GROUPSHP_H
  43. #include "GroupShp.h"
  44. #endif
  45.  
  46. #ifndef DEFINES_K
  47. #include "Defines.k"
  48. #endif
  49.  
  50. // ----- FrameWork Includes -----
  51.  
  52. #ifndef FWPRESEN_H
  53. #include "FWPresen.h"
  54. #endif
  55.  
  56. #ifndef FWMEMMGR_H
  57. #include "FWMemMgr.h"
  58. #endif
  59.  
  60. #ifndef FWSOMENV_H
  61. #include "FWSOMEnv.h"
  62. #endif
  63.  
  64. #ifndef SOM_ODShape_xh
  65. #include <Shape.xh>
  66. #endif
  67.  
  68. #ifndef FWSESION_H
  69. #include "FWSesion.h"
  70. #endif
  71.  
  72. //========================================================================================
  73. // RunTime Info
  74. //========================================================================================
  75.  
  76. #ifdef FW_BUILD_MAC
  77. #pragma segment odfdrawcommand
  78. #endif
  79.  
  80. FW_DEFINE_AUTO(CDrawShapeCommand)
  81. FW_DEFINE_AUTO(CResizeShapeCommand)
  82. FW_DEFINE_AUTO(CChangeShapeCommand)
  83. FW_DEFINE_AUTO(CChangeColorCommand)
  84. FW_DEFINE_AUTO(CChangePatternCommand)
  85. FW_DEFINE_AUTO(CChangeRenderVerbCommand)
  86. FW_DEFINE_AUTO(CChangePenSizeCommand)
  87.     
  88. //========================================================================================
  89. // CDrawShapeCommand
  90. //========================================================================================
  91.  
  92. //----------------------------------------------------------------------------------------
  93. //    CDrawShapeCommand constructor
  94. //----------------------------------------------------------------------------------------
  95. CDrawShapeCommand::CDrawShapeCommand(Environment* ev,
  96.                                     CDrawPart* part, 
  97.                                     FW_CFrame* frame,
  98.                                      CDrawSelection* selection,
  99.                                      CBaseShape* newShape) :
  100. #if defined(FW_BUILD_WIN) && FW_OPENDOC_VERSION == FW_OPENDOC_DR1
  101.     FW_CCommand(ev, cDrawShapeCommand, frame, FW_kCantUndo),
  102. #else
  103.     FW_CCommand(ev, cDrawShapeCommand, frame, FW_kCanUndo),
  104. #endif
  105.         fDrawPart(part),
  106.         fDrawSelection(selection),
  107.         fNewContent(NULL)
  108. {
  109.     SetMenuStringsFromResource(ev, kDrawUndoStrings, kUndoDrawingMsg, kRedoDrawingMsg);
  110.  
  111.     fNewContent = FW_NEW(CDrawContent, (ev, part, fDrawSelection->GetDragRect()));
  112.     fNewContent->AddShape(ev, newShape);
  113.  
  114.     FW_END_CONSTRUCTOR    
  115. }
  116.  
  117. //----------------------------------------------------------------------------------------
  118. //    CDrawShapeCommand destructor
  119. //----------------------------------------------------------------------------------------
  120. CDrawShapeCommand::~CDrawShapeCommand()
  121. {
  122.     FW_START_DESTRUCTOR
  123.     delete fNewContent;
  124. }
  125.  
  126. //----------------------------------------------------------------------------------------
  127. //    CDrawShapeCommand::FreeRedoState
  128. //----------------------------------------------------------------------------------------
  129. void CDrawShapeCommand::FreeRedoState(Environment* ev)
  130. {
  131.     // Delete the new shape
  132.     CBaseShape* newShape = fNewContent->GetFirstShape();
  133.     fNewContent->EmptyShapes(ev);
  134.     delete newShape;
  135. }
  136.  
  137. //----------------------------------------------------------------------------------------
  138. //    CDrawShapeCommand::DoIt
  139. //----------------------------------------------------------------------------------------
  140. void CDrawShapeCommand::DoIt(Environment* ev)    // Override
  141. {
  142.     if (this->IsOKtoEdit(ev))
  143.     {
  144.         fDrawPart->AddShapeToPart(ev, fNewContent->GetFirstShape());
  145.     //    fDrawSelection->SelectContent(ev, fNewContent);
  146.     }
  147.     else
  148.     {
  149.         this->SetCausesChange(ev, false);
  150.         this->SetCanUndo(ev, false);
  151.     }
  152. }
  153.  
  154. //----------------------------------------------------------------------------------------
  155. //    CDrawShapeCommand::UndoIt
  156. //----------------------------------------------------------------------------------------
  157. void CDrawShapeCommand::UndoIt(Environment* ev)    // Override
  158. {
  159.     // Unselect everything
  160.     fDrawSelection->CloseSelection(ev);
  161.  
  162.     // Remove the shape from the part
  163.     fDrawPart->RemoveShapeFromPart(ev, fNewContent->GetFirstShape());
  164.     fNewContent->RedrawShapes(ev);    // force redraw
  165. }
  166.  
  167. //----------------------------------------------------------------------------------------
  168. //    CDrawShapeCommand::RedoIt
  169. //----------------------------------------------------------------------------------------
  170. void CDrawShapeCommand::RedoIt(Environment* ev)    // Override
  171. {
  172.     // Add the shape back into the part
  173.     fDrawPart->AddShapeToPart(ev, fNewContent->GetFirstShape());
  174.     fNewContent->RedrawShapes(ev);    // force redraw
  175.  
  176.     // Select the shape
  177.     fDrawSelection->SelectContent(ev, fNewContent);
  178. }
  179.  
  180. //========================================================================================
  181. // CResizeShapeCommand
  182. //========================================================================================
  183.  
  184. //----------------------------------------------------------------------------------------
  185. //    CResizeShapeCommand constructor
  186. //----------------------------------------------------------------------------------------
  187. CResizeShapeCommand::CResizeShapeCommand(Environment* ev, 
  188.                                         CDrawPart* part, 
  189.                                          FW_CFrame* frame,
  190.                                          CDrawSelection* selection,
  191.                                          const FW_CRect& srcRect,
  192.                                          const FW_CRect& dstRect) :
  193. #if defined(FW_BUILD_WIN) && FW_OPENDOC_VERSION == FW_OPENDOC_DR1
  194.     FW_CCommand(ev, cResizeCommand, frame, FW_kCantUndo),
  195. #else
  196.     FW_CCommand(ev, cResizeCommand, frame, FW_kCanUndo),
  197. #endif
  198.         fDrawPart(part),
  199.         fDrawSelection(selection),
  200.         fSourceRect(srcRect),
  201.         fDestRect(dstRect),
  202.         fUpdateShape(NULL),
  203.         fChangedContent(NULL)
  204. {
  205.     SetMenuStringsFromResource(ev, kDrawUndoStrings, kUndoResizeMsg, kRedoResizeMsg);
  206.     FW_END_CONSTRUCTOR    
  207. }
  208.  
  209. //----------------------------------------------------------------------------------------
  210. //    CResizeShapeCommand destructor
  211. //----------------------------------------------------------------------------------------
  212. CResizeShapeCommand::~CResizeShapeCommand()
  213. {
  214.     FW_START_DESTRUCTOR
  215.     delete fChangedContent;
  216.     
  217.     if (fUpdateShape)
  218.     {
  219.         FW_SOMEnvironment ev;
  220.         fUpdateShape->Release(ev);
  221.     }
  222.     fUpdateShape = NULL;
  223. }
  224.  
  225. //----------------------------------------------------------------------------------------
  226. //    CResizeShapeCommand::DoIt
  227. //----------------------------------------------------------------------------------------
  228. void CResizeShapeCommand::DoIt(Environment* ev)    // Override
  229. {
  230.     if (!this->IsOKtoEdit(ev))
  231.     {
  232.         SetCanUndo(ev, false);
  233.         SetCausesChange(ev, false);
  234.         return;
  235.     }
  236.  
  237.     // Copy selected shape pointers to our content object
  238.     FW_ASSERT(fChangedContent == NULL);
  239.     fChangedContent = FW_NEW(CDrawContent, (ev, fDrawPart, fDrawSelection->GetDrawContent(ev)));
  240.  
  241.     FW_ASSERT(fUpdateShape == NULL);
  242.     fUpdateShape = fChangedContent->CalcUpdateShape(ev);
  243.  
  244.     this->MapShapes(ev, fSourceRect, fDestRect);
  245.  
  246.     {
  247.         FW_CAcquiredODShape tempShape = fChangedContent->CalcUpdateShape(ev);
  248.         fUpdateShape->Union(ev, tempShape);
  249.     }
  250.     
  251.     this->Redraw(ev, kODDone);
  252. }
  253.  
  254. //----------------------------------------------------------------------------------------
  255. //    CResizeShapeCommand::UndoIt
  256. //----------------------------------------------------------------------------------------
  257. void CResizeShapeCommand::UndoIt(Environment* ev)    // Override
  258. {
  259.     this->MapShapes(ev, fDestRect, fSourceRect);
  260.     this->Redraw(ev, kODUndone);
  261. }
  262.  
  263. //----------------------------------------------------------------------------------------
  264. //    CResizeShapeCommand::RedoIt
  265. //----------------------------------------------------------------------------------------
  266. void CResizeShapeCommand::RedoIt(Environment* ev)    // Override
  267. {
  268.     this->MapShapes(ev, fSourceRect, fDestRect);
  269.     this->Redraw(ev, kODRedone);
  270. }
  271.  
  272. //----------------------------------------------------------------------------------------
  273. //    CResizeShapeCommand::MapShapes
  274. //----------------------------------------------------------------------------------------
  275. void CResizeShapeCommand::MapShapes(Environment* ev, const FW_CRect& srcRect, const FW_CRect& dstRect)
  276. {
  277.     //--- Resize each shape ---
  278.     CDrawContentShapeIterator it(fChangedContent);
  279.     for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
  280.     {
  281.         shape->MapShape(ev, srcRect, dstRect);
  282.     }
  283. }
  284.  
  285. //----------------------------------------------------------------------------------------
  286. //    CResizeShapeCommand::Redraw
  287. //----------------------------------------------------------------------------------------
  288. void CResizeShapeCommand::Redraw(Environment* ev, ODDoneState doneState)
  289. {
  290. FW_UNUSED(doneState);
  291.     FW_CPresentation* presentation = fDrawPart->GetMainPresentation();
  292.     presentation->Invalidate(ev, fUpdateShape);
  293.     
  294.     CDrawFacetClipper facetClipper(fDrawPart);
  295.     facetClipper.Clip(ev, presentation, fUpdateShape);
  296.  
  297.     // Select the resized shapes
  298.     fDrawSelection->SelectContent(ev, fChangedContent);
  299. }
  300.  
  301. //----------------------------------------------------------------------------------------
  302. //    CResizeShapeCommand::IsOKtoEdit
  303. //----------------------------------------------------------------------------------------
  304. FW_Boolean CResizeShapeCommand::IsOKtoEdit(Environment* ev) 
  305. {
  306.     FW_Boolean result = FW_CCommand::IsOKtoEdit(ev);
  307.     
  308.     if (result)
  309.         result = fDrawSelection->CanEditSelection(ev, GetFrame(ev));
  310.     
  311.     return result;
  312. }
  313.  
  314. //----------------------------------------------------------------------------------------
  315. //    CResizeShapeCommand::PropagateChanges
  316. //----------------------------------------------------------------------------------------
  317. void CResizeShapeCommand::PropagateChanges(Environment* ev, ODUpdateID id )
  318. {
  319.     if (id == kODUnknownUpdate)
  320.         id = FW_CSession::UniqueUpdateID(ev);
  321.         
  322.     fDrawSelection->SelectionChanged(ev, id);
  323.     FW_CCommand::PropagateChanges(ev, id);
  324. }
  325.  
  326.  
  327.  
  328. //========================================================================================
  329. // CChangeShapeCommand
  330. //========================================================================================
  331.  
  332. //----------------------------------------------------------------------------------------
  333. //    CChangeShapeCommand constructor
  334. //----------------------------------------------------------------------------------------
  335.  
  336. CChangeShapeCommand::CChangeShapeCommand(Environment* ev,
  337.                                         ODCommandID id,
  338.                                          CDrawPart* part, 
  339.                                          FW_CFrame* frame,
  340.                                          CDrawSelection* selection) :
  341.     FW_CCommand(ev, id, frame, FW_kCanUndo),
  342.     fDrawPart(part),
  343.     fDrawSelection(selection),
  344.     fChangedContent(NULL)
  345. {
  346.     FW_END_CONSTRUCTOR    
  347. }
  348.  
  349. //----------------------------------------------------------------------------------------
  350. //    CChangeShapeCommand destructor
  351. //----------------------------------------------------------------------------------------
  352.  
  353. CChangeShapeCommand::~CChangeShapeCommand()
  354. {
  355.     FW_START_DESTRUCTOR
  356.     delete fChangedContent;
  357. }
  358.  
  359. //----------------------------------------------------------------------------------------
  360. //    CChangeShapeCommand::DoIt
  361. //----------------------------------------------------------------------------------------
  362.  
  363. void CChangeShapeCommand::DoIt(Environment* ev)            // Override
  364. {
  365.     if (!this->IsOKtoEdit(ev))
  366.     {
  367.         SetCanUndo(ev, false);
  368.         SetCausesChange(ev, false);
  369.         return;
  370.     }
  371.  
  372.     // Copy selected shape pointers to our content object
  373.     FW_ASSERT(fChangedContent == NULL);
  374.     fChangedContent = FW_NEW(CDrawContent, (ev, fDrawPart, fDrawSelection->GetDrawContent(ev)));
  375.  
  376.     this->SaveUndoState(ev);    // Save command-specific data
  377.     this->DoChange(ev);            // perform command-specific tasks
  378.  
  379.     this->UpdateDisplay(ev);
  380. }
  381.  
  382. //----------------------------------------------------------------------------------------
  383. //    CChangeShapeCommand::UndoIt
  384. //----------------------------------------------------------------------------------------
  385.  
  386. void CChangeShapeCommand::UndoIt(Environment* ev)            // Override
  387. {
  388.     // Iterate through the shape list, undoing each change
  389.     CAllShapeIterator it(fChangedContent);
  390.     unsigned long index = 0;
  391.     for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
  392.     {
  393.         this->UndoShape(ev, shape, index);
  394.         index++;
  395.     }
  396.  
  397.     this->UpdateDisplay(ev);
  398. }
  399.  
  400. //----------------------------------------------------------------------------------------
  401. //    CChangeShapeCommand::RedoIt
  402. //----------------------------------------------------------------------------------------
  403.  
  404. void CChangeShapeCommand::RedoIt(Environment* ev)            // Override
  405. {
  406.     this->DoChange(ev);
  407.     this->UpdateDisplay(ev);
  408. }
  409.  
  410. //----------------------------------------------------------------------------------------
  411. //    CChangeShapeCommand::UpdateDisplay
  412. //----------------------------------------------------------------------------------------
  413.  
  414. void CChangeShapeCommand::UpdateDisplay(Environment* ev)
  415. {
  416.     // Redraw the changed shapes
  417.     fChangedContent->RedrawShapes(ev);
  418.  
  419.     // Select the changed shapes
  420.     fDrawSelection->SelectContent(ev, fChangedContent);
  421. }
  422.  
  423. //----------------------------------------------------------------------------------------
  424. //    CChangeShapeCommand::IsOKtoEdit
  425. //----------------------------------------------------------------------------------------
  426.  
  427. FW_Boolean CChangeShapeCommand::IsOKtoEdit(Environment* ev)
  428. {
  429.     FW_Boolean result = FW_CCommand::IsOKtoEdit(ev);
  430.     
  431.     if (result)
  432.         result = fDrawSelection->CanEditSelection(ev, GetFrame(ev));
  433.     
  434.     return result;
  435. }
  436.  
  437. //----------------------------------------------------------------------------------------
  438. //    CChangeShapeCommand::PropagateChanges
  439. //----------------------------------------------------------------------------------------
  440.  
  441. void CChangeShapeCommand::PropagateChanges(Environment* ev, ODUpdateID id) 
  442. {
  443.     
  444.     if (id == kODUnknownUpdate)
  445.         id = FW_CSession::UniqueUpdateID(ev);
  446.         
  447.     fDrawSelection->SelectionChanged(ev, id);
  448.     
  449.     FW_CCommand::PropagateChanges(ev, id);
  450. }
  451.  
  452.  
  453.  
  454. //========================================================================================
  455. // CChangeColorCommand
  456. //========================================================================================
  457.  
  458. //----------------------------------------------------------------------------------------
  459. //    CChangeColorCommand constructor
  460. //----------------------------------------------------------------------------------------
  461.  
  462. CChangeColorCommand::CChangeColorCommand(Environment* ev,
  463.                                         ODCommandID commandID,
  464.                                         CDrawPart* part, 
  465.                                         FW_CFrame* frame,
  466.                                         CDrawSelection* selection,
  467.                                         const FW_CColor& newColor)
  468.     : CChangeShapeCommand(ev, commandID, part, frame, selection),
  469.         fNewColor(newColor),
  470.         fOldColors(NULL),
  471.         fIsFill(commandID == cChangeFillColor)
  472. {
  473.     if (fIsFill)
  474.         SetMenuStringsFromResource(ev, kDrawUndoStrings, kUndoFillColorMsg, kRedoFillColorMsg);
  475.     else
  476.         SetMenuStringsFromResource(ev, kDrawUndoStrings, kUndoFrameColorMsg, kRedoFrameColorMsg);
  477.  
  478.     FW_END_CONSTRUCTOR    
  479. }
  480.  
  481. //----------------------------------------------------------------------------------------
  482. //    CChangeColorCommand destructor
  483. //----------------------------------------------------------------------------------------
  484.  
  485. CChangeColorCommand::~CChangeColorCommand()
  486. {
  487.     FW_START_DESTRUCTOR
  488.     FW_CMemoryManager::FreeBlock(fOldColors);
  489. }
  490.  
  491. //----------------------------------------------------------------------------------------
  492. //    CChangeColorCommand::DoChange
  493. //----------------------------------------------------------------------------------------
  494.  
  495. void CChangeColorCommand::DoChange(Environment* ev)            // Override
  496. {
  497.     CAllShapeIterator it(fChangedContent);
  498.     for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
  499.     {
  500.         if (fIsFill)
  501.             shape->ChangeFillColor(ev, fNewColor);
  502.         else
  503.             shape->ChangeFrameColor(ev, fNewColor);
  504.     }
  505. }
  506.  
  507. //----------------------------------------------------------------------------------------
  508. //    CChangeColorCommand::UndoShape
  509. //----------------------------------------------------------------------------------------
  510.  
  511. void CChangeColorCommand::UndoShape(Environment* ev, CBaseShape* shape, unsigned long index)    // Override
  512. {
  513.     if (fIsFill)
  514.         shape->ChangeFillColor(ev, fOldColors[index]);
  515.     else
  516.         shape->ChangeFrameColor(ev, fOldColors[index]);        
  517. }
  518.  
  519. //----------------------------------------------------------------------------------------
  520. //    CChangeColorCommand::SaveUndoState
  521. //----------------------------------------------------------------------------------------
  522.  
  523. void CChangeColorCommand::SaveUndoState(Environment* ev)    // Override
  524. {
  525. FW_UNUSED(ev);
  526.     CAllShapeIterator it(fChangedContent);
  527.  
  528.     // Create array to hold colors
  529.     unsigned long shapeCount = it.CountShapes();    // count shapes, including grouped ones
  530.     fOldColors = (FW_CColor*)FW_CMemoryManager::AllocateBlock(sizeof(FW_CColor) * shapeCount);
  531.  
  532.     // Save shapes' colors
  533.     FW_CColor color;
  534.     short index = 0;
  535.     for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
  536.     {
  537.         shape->GetColor(fIsFill, color);
  538.         fOldColors[index] = color;
  539.         index++;
  540.     }    
  541. }
  542.  
  543. //========================================================================================
  544. // class CChangePatternCommand
  545. //========================================================================================
  546.  
  547. //----------------------------------------------------------------------------------------
  548. //    CChangePatternCommand constructor
  549. //----------------------------------------------------------------------------------------
  550.  
  551. CChangePatternCommand::CChangePatternCommand(Environment* ev,
  552.                                             ODCommandID commandID,
  553.                                             CDrawPart* part,
  554.                                             FW_CFrame* frame,
  555.                                             CDrawSelection* selection,
  556.                                             const FW_CPattern& newPattern)
  557.     : CChangeShapeCommand(ev, commandID, part, frame, selection),
  558.         fNewPattern(newPattern),
  559.         fOldPatterns(NULL),
  560.         fCount(0),
  561.         fIsFill(commandID == cChangeFillPattern)
  562. {
  563.     if (fIsFill)
  564.         SetMenuStringsFromResource(ev, kDrawUndoStrings, kUndoFillPatternMsg, kRedoFillPatternMsg);
  565.     else
  566.         SetMenuStringsFromResource(ev, kDrawUndoStrings, kUndoFramePatternMsg, kRedoFramePatternMsg);
  567.     
  568.     FW_END_CONSTRUCTOR    
  569. }
  570.  
  571. //----------------------------------------------------------------------------------------
  572. //    CChangePatternCommand destructor
  573. //----------------------------------------------------------------------------------------
  574.  
  575. CChangePatternCommand::~CChangePatternCommand()
  576. {
  577.     FW_START_DESTRUCTOR
  578.     
  579.     if (fOldPatterns)
  580.     {
  581.         for (unsigned short i = 0; i < fCount; i++)
  582.             delete fOldPatterns[i];
  583.         FW_CMemoryManager::FreeBlock(fOldPatterns);
  584.     }
  585. }
  586.  
  587. //----------------------------------------------------------------------------------------
  588. //    CChangePatternCommand::DoChange
  589. //----------------------------------------------------------------------------------------
  590.  
  591. void CChangePatternCommand::DoChange(Environment* ev)    // Override
  592. {
  593.     CAllShapeIterator it(fChangedContent);
  594.     for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
  595.     {
  596.         if (fIsFill)
  597.             shape->ChangeFillPattern(ev, fNewPattern);
  598.         else 
  599.             shape->ChangeFramePattern(ev, fNewPattern);
  600.     }
  601. }
  602.  
  603. //----------------------------------------------------------------------------------------
  604. //    CChangePatternCommand::UndoShape
  605. //----------------------------------------------------------------------------------------
  606.  
  607. void CChangePatternCommand::UndoShape(Environment* ev, CBaseShape* shape, unsigned long index)    // Override
  608. {
  609.     if (fIsFill)
  610.         shape->ChangeFillPattern(ev, *(fOldPatterns[index]));
  611.     else
  612.         shape->ChangeFramePattern(ev, *(fOldPatterns[index]));
  613. }
  614.  
  615. //----------------------------------------------------------------------------------------
  616. //    CChangePatternCommand::SaveUndoState
  617. //----------------------------------------------------------------------------------------
  618.  
  619. void CChangePatternCommand::SaveUndoState(Environment* ev)    // Override
  620. {
  621. FW_UNUSED(ev);
  622.     CAllShapeIterator it(fChangedContent);
  623.  
  624.     // Create array to hold patterns
  625.     unsigned long shapeCount = it.CountShapes();    // count shapes, including grouped ones
  626.     fOldPatterns = (FW_CPattern**)FW_CMemoryManager::AllocateBlock(sizeof(FW_CPattern*) * shapeCount);
  627. //    fOldPatterns = new FW_CPattern*[shapeCount];
  628.  
  629.     // Save shapes' patterns
  630.     for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
  631.     {
  632.         fOldPatterns[fCount] = FW_NEW(FW_CPattern, (shape->GetPattern(fIsFill)));
  633.         fCount++;
  634.     }    
  635. }
  636.  
  637. //========================================================================================
  638. // class CChangeRenderVerbCommand
  639. //========================================================================================
  640.  
  641. //----------------------------------------------------------------------------------------
  642. //    CChangeRenderVerbCommand constructor
  643. //----------------------------------------------------------------------------------------
  644.  
  645. CChangeRenderVerbCommand::CChangeRenderVerbCommand(Environment* ev,
  646.                                                     CDrawPart* part, 
  647.                                                     FW_CFrame* frame,
  648.                                                    CDrawSelection* selection,
  649.                                                    unsigned short newRenderVerb)
  650.     : CChangeShapeCommand(ev, cChangeRenderVerb, part, frame, selection),
  651.         fNewRenderVerb(newRenderVerb),
  652.         fOldRenderVerbs(NULL)
  653. {
  654.     SetMenuStringsFromResource(ev, kDrawUndoStrings, kUndoRenderVerbMsg, kRedoRenderVerbMsg);
  655.     FW_END_CONSTRUCTOR    
  656. }
  657.  
  658. //----------------------------------------------------------------------------------------
  659. //    CChangeRenderVerbCommand destructor
  660. //----------------------------------------------------------------------------------------
  661.  
  662. CChangeRenderVerbCommand::~CChangeRenderVerbCommand()
  663. {
  664.     FW_START_DESTRUCTOR
  665.     delete [] fOldRenderVerbs;
  666. }
  667.  
  668. //----------------------------------------------------------------------------------------
  669. //    CChangeRenderVerbCommand::DoChange
  670. //----------------------------------------------------------------------------------------
  671.  
  672. void CChangeRenderVerbCommand::DoChange(Environment* ev)    // Override
  673. {
  674.     CAllShapeIterator it(fChangedContent);
  675.     for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
  676.     {
  677.         shape->ChangeRenderVerb(ev, fNewRenderVerb);
  678.     }
  679. }
  680.  
  681. //----------------------------------------------------------------------------------------
  682. //    CChangeRenderVerbCommand::UndoShape
  683. //----------------------------------------------------------------------------------------
  684.  
  685. void CChangeRenderVerbCommand::UndoShape(Environment* ev, CBaseShape* shape, unsigned long index)    // Override
  686. {
  687.     shape->ChangeRenderVerb(ev, fOldRenderVerbs[index]);
  688. }
  689.  
  690. //----------------------------------------------------------------------------------------
  691. //    CChangeRenderVerbCommand::SaveUndoState
  692. //----------------------------------------------------------------------------------------
  693.  
  694. void CChangeRenderVerbCommand::SaveUndoState(Environment* ev)    // Override
  695. {
  696. FW_UNUSED(ev);
  697.     CAllShapeIterator it(fChangedContent);
  698.  
  699.     // Create array to hold render verbs
  700.     unsigned long shapeCount = it.CountShapes();    // count shapes, including grouped ones
  701.     fOldRenderVerbs = new unsigned short[shapeCount];
  702.  
  703.     // Finally, save shapes' render verbs
  704.     unsigned short verb;
  705.     short index = 0;
  706.     for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
  707.     {
  708.         verb = shape->GetRenderVerb();
  709.         fOldRenderVerbs[index] = verb;
  710.     }    
  711. }
  712.  
  713. //========================================================================================
  714. // class CChangePenSizeCommand
  715. //========================================================================================
  716.  
  717. //----------------------------------------------------------------------------------------
  718. //    CChangePenSizeCommand constructor
  719. //----------------------------------------------------------------------------------------
  720.  
  721. CChangePenSizeCommand::CChangePenSizeCommand(Environment* ev,
  722.                                              CDrawPart* part, 
  723.                                              FW_CFrame* frame,
  724.                                              CDrawSelection* selection,
  725.                                              FW_Fixed newPenSize)
  726.     : CChangeShapeCommand(ev, cChangePenSize, part, frame, selection),
  727.         fNewPenSize(newPenSize),
  728.         fOldPenSizes(NULL)
  729. {
  730.     SetMenuStringsFromResource(ev, kDrawUndoStrings, kUndoPenSizeMsg, kRedoPenSizeMsg);
  731.     FW_END_CONSTRUCTOR    
  732. }
  733.  
  734. //----------------------------------------------------------------------------------------
  735. //    CChangePenSizeCommand destructor
  736. //----------------------------------------------------------------------------------------
  737.  
  738. CChangePenSizeCommand::~CChangePenSizeCommand()
  739. {
  740.     FW_START_DESTRUCTOR
  741.     delete [] fOldPenSizes;
  742. }
  743.  
  744. //----------------------------------------------------------------------------------------
  745. //    CChangePenSizeCommand::DoChange
  746. //----------------------------------------------------------------------------------------
  747.  
  748. void CChangePenSizeCommand::DoChange(Environment* ev)    // Override
  749. {
  750.     CAllShapeIterator it(fChangedContent);
  751.     for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
  752.     {
  753.         shape->ChangePenSize(ev, fNewPenSize);
  754.     }
  755. }
  756.  
  757. //----------------------------------------------------------------------------------------
  758. //    CChangePenSizeCommand::UndoShape
  759. //----------------------------------------------------------------------------------------
  760.  
  761. void CChangePenSizeCommand::UndoShape(Environment* ev, CBaseShape* shape, unsigned long index)    // Override
  762. {
  763.     shape->ChangePenSize(ev, fOldPenSizes[index]);
  764. }
  765.  
  766. //----------------------------------------------------------------------------------------
  767. //    CChangePenSizeCommand::SaveUndoState
  768. //----------------------------------------------------------------------------------------
  769.  
  770. void CChangePenSizeCommand::SaveUndoState(Environment* ev)    // Override
  771. {
  772. FW_UNUSED(ev);
  773.     CAllShapeIterator it(fChangedContent);
  774.  
  775.     // Create array to hold pen sizes
  776.     unsigned long shapeCount = it.CountShapes();    // count shapes, including grouped ones
  777.     fOldPenSizes = new FW_Fixed[shapeCount];
  778.  
  779.     // Finally, save shapes' pen sizes
  780.     FW_Fixed penSize;
  781.     short index = 0;
  782.     for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
  783.     {
  784.         penSize = shape->GetPenSize();
  785.         fOldPenSizes[index] = penSize;
  786.     }    
  787. }
  788.